import axios, {
  AxiosError,
  InternalAxiosRequestConfig,
  AxiosResponse,
} from "axios";

//对响应状态码的统一处理
const errorHandle = (status: number, info: string) => {
  switch (status) {
    case 400:
      alert("语义有误");
      break;
    case 401:
      alert("服务器认证失败");
      break;
    case 403:
      alert("服务器拒绝访问");
      break;
    case 404:
      alert("地址有误");
      break;
    case 500:
      alert("服务器遇到意外");
      break;
    case 502:
      alert("服务器无响应");
      break;
    default:
      alert(info);
      break;
  }
};
const config = {
  // 默认地址请求地址，可在 .env.** 文件中修改
  baseURL: "http://127.0.0.1",
  // 设置超时时间
  timeout: 2000,
  // 跨域时候允许携带凭证
  withCredentials: true,
};

export const http = axios.create(config);

/**
 * @use 请求拦截器
 * 客户端发送请求 -> [请求拦截器] -> 服务器
 * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中
 */
http.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);

/**
 * @use 响应拦截器
 *  服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
 */
http.interceptors.response.use(
  (response: AxiosResponse) => {
    const { data } = response;
    // 请求失败
    if (data.code == -1) {
      alert(data.msg);
      return Promise.reject(`${data.msg}`);
    }

    return data;
  },
  (error: any) => {
    errorHandle(error.response.status, error.message);
    return Promise.reject(error);
  }
);
